import multiprocessing
import os
import time

"""
多进程的设计:
    进程控制

    terminate(self):关闭进程
    is_alive(self):是否存活
    join(self,timeout):加入队列强制执行
    p.is_alive(): 判断子线程p1是否存活
    p.terminate(): 强制结束
    p.Process(daemon=true): 守护进程,主线程开启同时他也开启,主线程结束他也结束
    pid = os.fork() # 创建子进程 只支持linux  windows会报错:Has no attribute fork  
    {pid<0创建失败,pid=0子进程获取数据,pid>0父进程获取数据 }
    psutil :进程工具,pip install psutil 

    # join()
    所有的进程通过start()方法启动,而后多个进程进入到阻塞队列,这时候某一个进程是不可能强占cpu的
    如果这个时候有一个进程必须要现在执行,那就要使用join()
    
# 进程池
        多进程可以提高程序运行效率,但是传统的的多进程模式只适合并发并不多的情况:成百上千的并发进程就不适合使用了,
    会造成资源过多的消耗,导致资源不足的问题,从而降低了系统性能,所以要提高资源的利用率,以及进程的可复用性
    
    
# 管道
        为什么使用管道?
        进程和进程之间不能直接通讯,需要用管道连接两个进程才能通讯
"""

# 发送
def send(conn, msg):
    conn.send(['管道发送信息',msg])

# 接收
def receive(conn):
    print(conn.recv())


def main():
    conn_send,conn_recv = multiprocessing.Pipe()
    # 创建两个进程,收发进程
    p_send = multiprocessing.Process(target=send,args=(conn_send,'hello pipe'))
    p_recv = multiprocessing.Process(target=receive,args=(conn_recv,))
    p_recv.start()
    p_send.start()


if __name__ == '__main__':
    main()